package com.gitee.sop.websiteserver.service;

import com.alibaba.fastjson.JSONObject;
import com.gitee.sop.message.util.ObjectUtil;
import com.gitee.sop.mongodb.MongoDbUtil;
import com.gitee.sop.mongodb.MongoQuery;
import com.gitee.sop.websiteserver.constants.TemplateStatus;
import com.gitee.sop.websiteserver.entity.FileConfig;
import com.gitee.sop.websiteserver.service.impl.BaseServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.*;

/**
 * 邮箱/短信验证码获取
 *
 * @author wlx
 */
@Component
public class FileConfigHandler extends BaseServiceImpl {
    @Resource
    private MongoDbUtil mongoDbUtil;


    /**
     * 添加/修改文件上传配置
     *
     * @param fileConfig 参数信息
     */
    public void addOrUpdate(FileConfig fileConfig) {
        String id = fileConfig.getId();
        String type = fileConfig.getType();
        if ("auto".equals(type)) {
            //@TODO *自配置型：需要配置自己申请的相关的支付配置信息即可使用对应的文件上传功能
            String appId = fileConfig.getAppId();
            String templateType = fileConfig.getTemplateType();
            //保持永久模式
            JSONObject jsonObject = checkAndGetConfig(appId);
            if (Objects.nonNull(jsonObject)) {
                String _id = jsonObject.get("_id").toString();
                if (StringUtils.isNotBlank(id) && id.equals(_id)) {
                    List<Object> ids = new ArrayList<>();
                    ids.add(id);
                    mongoDbUtil.deleteDocument(getCollectionName(), "_id", ids);
                } else {
                    //已存在开启的配置信息，将其修改为禁用状态
                    jsonObject.put("status", TemplateStatus.DISABLE.getCode());
                    mongoDbUtil.updateOne(getCollectionName(), "_id", jsonObject.getString("_id"), jsonObject);
                }
            }
            //整理参数，生成对应有效的开始、结束时间，准备新增到数据库中
            JSONObject extData = fileConfig.getExtData();
            if (Objects.nonNull(extData)) {
                fileConfig.setStatus(TemplateStatus.normal.getCode());
                fileConfig.setStartTime(new Date());
                //目前默认设置到期时间为365天，最理想设置为永久
                Date endTime = DateUtils.addDays(fileConfig.getStartTime(), 365);
                fileConfig.setEndTime(endTime);
                Map<String, Object> map = ObjectUtil.toMap(fileConfig);
                map.remove("extData");
                map.remove("id");
                extData.putAll(map);
                extData.remove("_id");
                //存入数据库
                List<JSONObject> list = new ArrayList<>();
                list.add(extData);
                mongoDbUtil.insertDocument(getCollectionName(), list);
            }
        } else if ("pay".equals(type)) {
            //@TODO 支付型：需要先支付即可提供对应的文件上传的功能，但不能使应用者拥有提供的配置参数，可使用不可查看和更改
            //按提供的价格配置信息表进行相关参数整理

            //订单号 查询订单是否支付成功

        }

    }

    /**
     * 校验文件模板是否可正常使用
     *
     * @param appId 应用ID
     * @return
     */
    public JSONObject checkAndGetConfig(String appId) {
        List<MongoQuery> mongoQueries = new ArrayList<>();
        mongoQueries.add(new MongoQuery("appId", appId));
        mongoQueries.add(new MongoQuery("status", TemplateStatus.normal.getCode()));
        JSONObject jsonObject = mongoDbUtil.queryOne(getCollectionName(), mongoQueries, JSONObject.class);
        if (Objects.nonNull(jsonObject)) {
            return jsonObject;
        }
        return null;
    }


    @Override
    protected String getCollectionName() {
        return "filesystemConfig";
    }
}